﻿using Resn.WhuPub.BLL;
using Resn.WhuPub.DAL;
using Resn.WhuPub.DML;
using System;
using System.Collections.Generic;
using System.Diagnostics.Contracts;
using System.Linq;

namespace Resn.WhuPub.BLL
{
        /// <summary>
        /// 实现校区/分公司的属性和方法
        /// </summary>
        public class Branch :Entity<BranchModel>
        {
                /// <summary>
                /// 初始化<see cref="Branch"/>校区/分公司.
                /// </summary>
                /// <param name="model">校区/分公司模型</param>
                public Branch(BranchModel model)
                        : base(model)
                {
                }

                #region 常量

#pragma warning disable 1591

                public const string CompanySubName = "总公司";

                public const string SchoolSubName = "主校区";

#pragma warning restore 1591

                #endregion

                #region 属性

                #region 基本属性



                /// <summary>
                /// 获取校区/分公司所属学校/公司的Id
                /// </summary>
                /// <value>
                /// 校区/分公司所属学校/公司的Id
                /// </value>
                public string CorporateId
                {
                        get
                        {
                                return Model.CorporateId;
                        }
                }

                /// <summary>
                /// 获取或设置校区/分公司的名称
                /// </summary>
                /// <value>
                /// 校区/分公司的名称
                /// </value>
                public string Name
                {
                        get
                        {
                                return Model.Name;
                        }
                        set
                        {
                                Model.Name = value;
                        }
                }

                /// <summary>
                /// 获取或设置校区/分公司的地址
                /// </summary>
                /// <value>
                /// 校区/分公司的地址
                /// </value>
                public string Address
                {
                        get
                        {
                                return Model.Address;
                        }
                        set
                        {
                                Model.Address = value;
                        }
                }

                /// <summary>
                /// 获取或设置校区/分公司的邮编
                /// </summary>
                /// <value>
                /// 校区/分公司的邮编
                /// </value>
                public string Postcode
                {
                        get
                        {
                                return Model.Postcode;
                        }
                        set
                        {
                                Model.Postcode = value;
                        }
                }

                /// <summary>
                /// 获取或设置校区/分公司所在的省份
                /// </summary>
                /// <value>
                /// 校区/分公司所在的省份
                /// </value>
                public string Province
                {
                        get
                        {
                                return Model.Province;
                        }
                        set
                        {
                                Model.Province = value;
                        }
                }

                /// <summary>
                /// 获取或设置校区/分公司所在的城市
                /// </summary>
                /// <value>
                /// 校区/分公司所在的城市
                /// </value>
                public string City
                {
                        get
                        {
                                return Model.City;
                        }
                        set
                        {
                                Model.City = value;
                        }
                }

                /// <summary>
                /// 获取或设置校区/分公司的网址
                /// </summary>
                /// <value>
                /// 校区/分公司的网址
                /// </value>
                public string Website
                {
                        get
                        {
                                return Model.Website;
                        }
                        set
                        {
                                Model.Website = value;
                        }
                }

                #endregion 基本属性

               

                /// <summary>
                /// 获取校区/分公司所属的学校/公司
                /// </summary>
                /// <value>
                /// 校区/分公司所属的学校/公司
                /// </value>
                public Corporate Corporate
                {
                        get
                        {
                                var model = DBStorage.Instance.Select<CorporateModel>(CorporateId);
                                return new Corporate(model);
                        }
                }

                public string FullName
                {
                        get { return Corporate.Name + Name; }
                }

                ///// <summary>
                ///// 获取校区/分公司所属的学校/公司名称
                ///// </summary>
                ///// <value>
                ///// 校区/分公司所属的学校/公司名称
                ///// </value>
                //public string CorporateName
                //{
                //        get
                //        {
                //                var model = DBStorage.Instance.Select<CorporateModel>(CorporateId);
                //                return model.Name;
                //        }
                //}

                /// <summary>
                /// 获取校区/分公司下属的部门集合
                /// </summary>
                /// <value>
                /// 校区/分公司下属的部门集合
                /// </value>
                public List<Department> Departments
                {
                        get
                        {
                                var models = DBStorage.Instance.Select<DepartmentModel>().Where(i => i.BranchId == Id).ToList();

                                var departments = new List<Department>();

                                models.ForEach(i => departments.Add(new Department(i)));

                                return departments;
                        }
                }

                #endregion 属性

                #region 方法

                /// <summary>
                /// 获取指定标识的对象
                /// </summary>
                /// <param name="id">标识</param>
                /// <returns></returns>
                public static Branch Select(string id)
                {
                        return Select<Branch>(id);
                }


                /// <summary>
                /// 添加对象到数据库
                /// </summary>
                /// <exception cref="System.InvalidOperationException">
                /// 分公司名称必须为空
                /// or
                /// 校区名称不能为空
                /// or
                /// 校区名称已存在，无法添加
                /// or
                /// 分公司已存在，无法添加
                /// </exception>
                public override void Insert()
                {
                        var corporate = Corporate;
                        var corporateBranchs = corporate.Branchs;

                        switch (corporate.CorporateLevel)
                        {
                                case CorporateLevel.公司:
                                        if (!String.IsNullOrEmpty(Name))
                                        {
                                                throw new InvalidOperationException("分公司名称必须为空");
                                        }
                                        break;

                                default:
                                        if (String.IsNullOrEmpty(Name))
                                        {
                                                throw new InvalidOperationException("校区名称不能为空");
                                        }
                                        break;
                        }




                        
                        if (DBCheck.ExistName(corporateBranchs, Name))
                        {
                                throw new InvalidOperationException("校区名称已存在，无法添加");
                        }

                        if (corporate.CorporateLevel == CorporateLevel.公司 && corporateBranchs.Count > 1)
                        {
                                throw new InvalidOperationException("分公司已存在，无法添加");
                        }

                        base.Insert();
                }


                /// <summary>
                /// 删除对象从数据库
                /// </summary>
                /// <exception cref="System.InvalidOperationException">该校区下属至少1个部门，无法删除</exception>
                public override void Delete()
                {
                        var departments = Departments;

                        foreach (var department in departments)
                        {
                                department.Delete();
                        }

                        base.Delete();
                }


                /// <summary>
                /// 更新对象到数据库
                /// </summary>
                /// <exception cref="System.InvalidOperationException">该名称分学校/分公司已存在</exception>
                public override void Update()
                {
                        if (DBCheck.ExistName(Corporate.Branchs, Name))
                        {
                                throw new InvalidOperationException("该名称分学校/分公司已存在");
                        }

                        base.Update();
                }

                /// <summary>
                /// 创建部门
                /// </summary>
                /// <param name="name">部门名称</param>
                /// <returns>
                /// 非null：    成功；
                ///    返回创建的下属部门
                ///
                /// null：      失败；
                ///    可能的原因：已存在同名下属部门；
                ///        学校下属部门名称不能为空；
                ///        公司下属部门名称必须为空；
                /// </returns>
                public Department CreateDepartment(string name = "")
                {
                        switch (Corporate.CorporateLevel)
                        {
                                case CorporateLevel.公司:
                                        if (!String.IsNullOrEmpty(name))
                                        {
                                                throw new InvalidOperationException("分公司下属部门名称必须为空");
                                        }
                                        break;

                                default:
                                        if (String.IsNullOrEmpty(name))
                                        {
                                                throw new InvalidOperationException("校区下属部门名称不能为空");
                                        }
                                        break;
                        }

                        var departments = Departments;
                        if (DBCheck.ExistName(departments, name))
                        {
                                throw new InvalidOperationException("同名称部门已存在，无法创建");
                        }

                        var model = new DepartmentModel
                                {
                                Id = Guid.NewGuid().ToString(),
                                BranchId = Id,
                                Name = name
                        };

                        return new Department(model);
                }

                

                #endregion 方法
        }
}